import argparse
import sys
import os
import re
from typing import Dict

class TextCounter:
    """文本计数器类"""
    
    def __init__(self, filename: str):
        """
        初始化计数器
        :param filename: 要统计的文件名
        """
        self.filename = filename
        self.content = ""
        
    def read_file(self) -> None:
        """读取文件内容"""
        try:
            with open(self.filename, 'r', encoding='utf-8') as file:
                self.content = file.read()
        except FileNotFoundError:
            print(f"错误: 文件 '{self.filename}' 未找到")
            sys.exit(1)
        except Exception as e:
            print(f"错误: 读取文件时发生错误 - {e}")
            sys.exit(1)
    
    def count_characters(self) -> int:
        """统计字符数（包括空格和换行符）"""
        return len(self.content)
    
    def count_words(self) -> int:
        """统计单词数"""
        # 使用正则表达式匹配英文单词
        words = re.findall(r'[a-zA-Z]+', self.content)
        return len(words)
    
    def count_sentences(self) -> int:
        """统计句子数"""
        # 简单的句子分割：以 . ! ? 结尾
        sentences = re.split(r'[.!?]+', self.content)
        # 过滤空字符串
        sentences = [s.strip() for s in sentences if s.strip()]
        return len(sentences)
    
    def count_lines(self) -> int:
        """统计行数"""
        return len(self.content.splitlines())
    
    def get_all_counts(self) -> Dict[str, int]:
        """获取所有统计信息"""
        return {
            'characters': self.count_characters(),
            'words': self.count_words(),
            'sentences': self.count_sentences(),
            'lines': self.count_lines()
        }

def main():
    """主函数"""
    # 创建命令行参数解析器
    parser = argparse.ArgumentParser(
        description='文本计数统计工具 - 统计文本文件的字符数、单词数、句子数等',
        prog='wc.py'
    )
    
    # 添加文件名参数（必需）
    parser.add_argument(
        'filename',
        help='要统计的文本文件路径'
    )
    
    # 添加统计选项参数
    parser.add_argument(
        '-c', '--chars',
        action='store_true',
        help='统计字符数'
    )
    
    parser.add_argument(
        '-w', '--words',
        action='store_true',
        help='统计单词数'
    )
    
    parser.add_argument(
        '-s', '--sentences',
        action='store_true',
        help='统计句子数'
    )
    
    parser.add_argument(
        '-l', '--lines',
        action='store_true',
        help='统计行数'
    )
    
    parser.add_argument(
        '-a', '--all',
        action='store_true',
        help='显示所有统计信息'
    )
    
    # 解析命令行参数
    args = parser.parse_args()
    
    # 检查文件是否存在
    if not os.path.exists(args.filename):
        print(f"错误: 文件 '{args.filename}' 不存在")
        sys.exit(1)
    
    # 创建计数器并读取文件
    counter = TextCounter(args.filename)
    counter.read_file()
    
    print(f"正在分析文件: {args.filename}")
    print("=" * 40)
    
    # 根据参数显示统计结果
    if args.all or not any([args.chars, args.words, args.sentences, args.lines]):
        # 显示所有统计信息
        counts = counter.get_all_counts()
        print(f"字符数: {counts['characters']}")
        print(f"单词数: {counts['words']}")
        print(f"句子数: {counts['sentences']}")
        print(f"行数: {counts['lines']}")
    else:
        # 显示指定统计信息
        if args.chars:
            print(f"字符数: {counter.count_characters()}")
        if args.words:
            print(f"单词数: {counter.count_words()}")
        if args.sentences:
            print(f"句子数: {counter.count_sentences()}")
        if args.lines:
            print(f"行数: {counter.count_lines()}")

# 程序入口点
if __name__ == '__main__':
    main()